package com.common.util.utils;

import android.text.TextUtils;
import android.util.Log;

import com.common.util.BuildConfig;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

/**
 * @文件名称：LogUtil.java
 * @文件作者：ljb
 * @文件描述：打印日志类
 * @版本： 1.0.0
 * @创建时间：2017-12-20 11:07
 * @修改历史：2017-12-20 11:07
 */

public class LogUtils {

    private static boolean LOG_ENABLE = Boolean.parseBoolean(BuildConfig.LOG_ENABLE);
    private static final String LINE_SEPARATOR = System.getProperty("line.separator");
    private static final int JSON_INDENT = 2;


    public static void v(String tag, String msg) {
        if (LOG_ENABLE) {
            msg = formatMsg(msg);
            Log.v(tag, msg);
        }
    }

    public static void i(String tag, String msg) {
        if (LOG_ENABLE) {
            msg = formatMsg(msg);
            Log.i(tag, msg);
        }
    }

    public static void d(String tag, String msg) {
        if (LOG_ENABLE) {
            msg = formatMsg(msg);
            Log.d(tag, msg);
        }
    }

    public static void w(String tag, String msg) {
        if (LOG_ENABLE) {
            msg = formatMsg(msg);
            Log.w(tag, msg);
        }
    }

    public static void e(String tag, String msg) {
        if (LOG_ENABLE) {
            msg = formatMsg(msg);
            Log.e(tag, msg);
        }
    }


    public static String formatMsg(String msg) {
        if (TextUtils.isEmpty(msg)) return "";
        StringBuilder logMsg = new StringBuilder(getLogAddress());
        if (msg.contains("{") && msg.contains("}")) {
            String str = msg.substring(0, msg.indexOf("{"));
            msg = msg.substring(msg.indexOf("{"), msg.lastIndexOf("}") + 1);
            logMsg.append(str).append(formatJson(msg));
        } else {
            logMsg.append(msg);
        }

        return logMsg.toString();
    }

    private static String formatJson(String json) {
        String result = null;
        if (TextUtils.isEmpty(json)) {
            return "";
        }

        try {
            if (json.startsWith("{")) {
                JSONObject jsonObject = new JSONObject(json);
                result = LINE_SEPARATOR + jsonObject.toString(JSON_INDENT);
            } else if (json.startsWith("[")) {
                JSONArray jsonArray = new JSONArray(json);
                result = LINE_SEPARATOR + jsonArray.toString(JSON_INDENT);
            } else {
                result = json;
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }


        return result;
    }

    /**
     * 获取Log输出的位置、类名、行号、方法名
     * @return
     */
    private static String getLogAddress() {
        StackTraceElement[] stackTraces = Thread.currentThread().getStackTrace();
        int size = stackTraces.length;
        int index = 5;
        if (index <= size) {
            String className = stackTraces[index].getFileName();
            String methodName = stackTraces[index].getMethodName();
            int lineNumber = stackTraces[index].getLineNumber();
            StringBuilder sb = new StringBuilder();
            sb.append("[(").append(className).append(":").append(lineNumber).append(")#").append(methodName).append("] ");
            return sb.toString();
        } else {
            return "";
        }
    }


}
